from tqdm import tqdm
import time

for i in tqdm(range(10000)):
    pass

import os
bee = os.path.split('C:/soft/python/test.py')
#分割了最后一个文档
print(bee)

# map()函数
# map 两个函数参数,一个是函数,一个是可迭代对象
a = list(map(str,[1,2,3,4,5,6,7,8,9]))
print(a)

# reduce的用法
# reduce 把一个函数作用在一个序列[x1,x2,x3,...]上,这个函数必须接受两个参数 ,reduce把结果继续和序列下一个元素做累积计算,其效果
def f(x):
    return x*x

# reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)

# 比方说对一个序列求和，就可以用reduce实现：
from functools import reduce
def add(x,y):
    return x+y
a = reduce(add,[1,3,5,7,9])
print(a)
# 加法没必要用,因为有sum
print(sum([1,3,5,7,9]))
# 但是如果要把序列[1, 3, 5, 7, 9]变换成整数13579，reduce就可以派上用场：
from functools import reduce
def fn(x,y):
    return x*10+y
print(reduce(fn,[1,3,5,7,9]))

def char2num(s):
    digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
    return digits[s]

b = reduce(fn, map(char2num,'13579'))
print(b)

# filter() 函数用于过滤序列,接受两个参数,一个是函数,一个是序列. 和map()不同的是，filter()把传入的函数依次作用于每个元素，然后根据返回值是True还是False决定保留还是丢弃该元素。
# 例如，在一个list中，删掉偶数，只保留奇数，可以这么写：
def is_odd(n):
    return n%2 == 1
c = list(map(is_odd,[1,2,5,9,7,4,0,1,2,2565]))
# map函数是生成 true和false
d = list(filter(is_odd,[1,2,5,9,7,4,0,1,2,2565]))
# filter 函数生成数字
print(c)
print(d)

# sorted() 函数是一个排序算法
e = sorted([36, 5, -12, 9, -21])
print(e)

# 接收一个key函数来实现自定义的排序，按绝对值大小
f = sorted([36, 5, -12, 9, -21], key=abs)
#abs是一个绝对值
print(f)

# 对字符串排序，是按照ASCII的大小比较的，由于'Z' < 'a'，结果，大写字母Z会排在小写字母a的前面。
g = sorted(['ao', 'bdsds', 'e', 'd'])
# 只比较首字母
print(g)
# 忽略大小写的排序
h = sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
print(h)

# 返回值
def calc_sum(*args):
    ax = 0
    for n in args:
        ax = ax + n
    # print(ax)
    return ax
calc_sum()
# 不立即返回求和结果，而是返回求和的函数
def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum
f = lazy_sum(1,3,5,7,9)
print(f)
print(f())

# python闭包
# 创建闭包满足的条件
# 1、必须有一个内嵌函数
# 2、内嵌函数必须引用外部函数中的变量
# 3、外部函数的返回值必须是内嵌函数
# 实现移动平均功能
def make_average():
    series = []

    def averager(new_value):
        series.append(new_value)
        total = sum(series)
        return total/len(series)

    return averager

avg = make_average()
print(avg(100))
print(avg(101))
print(avg(99))
print(avg(900))

# lambda函数 为匿名函数


# 装饰器  ------通过变量也能调用该函数
def now():
    print('2021-2-22')
f = now
f()

print(now.__name__)
print(f.__name__)
# 假如我们要增强now()函数的功能，比如，在函数调用前自动打印日志，但又不希望修改now()函数的定义，，这种在代码运行期间动态增加功能的方式，称之为“装饰器”（Decorator）。
def log(func):
    def wrapper(*args,**kw):
        # wrapper是先打印日志，再紧接着调用原始函数
        print("call %s():" % func.__name__)
        return func(*args, **kw)
    return wrapper


@log
def now():
    print("2021-2-22 4:51")

now()

#偏函数
def int2(x,base=2):
    return int(x,base)

i = int2('10000')
print(i)

